-- 接收参数
local limitKey = KEYS[1] -- 限流key
local holdKey = KEYS[2] -- 标记用户是否秒杀过该商品
local storeKey = KEYS[3] -- 库存key

local uid = ARGV[1] -- 用户id
local maxLimit = ARGV[2] -- 限流的阈值


-- 1.判断用户是否秒杀过该商品  判断holdKey是否在redis中存在  1存在  0 不存在
local exits = tonumber(redis.call('exists', holdKey))

if exits == 1 then
    -- 存在 用户秒杀过该商品
    return -1
end

-- 2.限流
-- 限流阈值
local limit = tonumber(maxLimit)

-- 根据key获取value  key当前的1秒内 value 访问的次数  若第一次访问 则是null，返回0
local current = tonumber(redis.call('get', limitKey) or "0")

if current + 1 > limit then
    return -2 -- 表示限流
end

-- 修改请求数   + 1
redis.call('incrby', limitKey, '1')

-- 设置ttl 2秒
redis.call('expire', limitKey, '2')

-- 3.判断库存是否充裕
local store = tonumber(redis.call('get', storeKey))
if store <= 0 then
    -- 库存不足
    return -3
end

-- 4.减库存
local leftStore = tonumber(redis.call('decrby', storeKey, '1'))


-- 5.设置用户已经秒杀过该商品
redis.call('set', holdKey, uid)

-- 返回剩余库存
return leftStore

